/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.webcrm.model;

import java.io.Serializable;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;

/**
 * 
 * @author Frederiko
 */
@Entity
@Table(name = "Usuarios", uniqueConstraints = { @UniqueConstraint(columnNames = { "login" }) })
@SequenceGenerator(name = "usuarios_idusuario_seq", sequenceName = "usuarios_idusuario_seq", allocationSize = 1)
@NamedQueries({
		@NamedQuery(name = "Usuario.findAll", query = "SELECT u FROM Usuario u"),
		@NamedQuery(name = "Usuario.findByIdUsuario", query = "SELECT u FROM Usuario u WHERE u.idUsuario = :idUsuario"),
		@NamedQuery(name = "Usuario.findByIdGrupo", query = "SELECT u FROM Usuario u WHERE u.grupo.idGrupo = :idGrupo and u.ativo = :ativo"),
		@NamedQuery(name = "Usuario.findByNomeUsuario", query = "SELECT u FROM Usuario u WHERE u.nomeUsuario = :nomeUsuario"),
		@NamedQuery(name = "Usuario.findByLogin", query = "SELECT u FROM Usuario u WHERE u.login = :login"),
		@NamedQuery(name = "Usuario.findBySenha", query = "SELECT u FROM Usuario u WHERE u.senha = :senha"),
		@NamedQuery(name = "Usuario.findByDdd", query = "SELECT u FROM Usuario u WHERE u.ddd = :ddd"),
		@NamedQuery(name = "Usuario.findByTelefone", query = "SELECT u FROM Usuario u WHERE u.telefone = :telefone"),
		@NamedQuery(name = "Usuario.findByEmail", query = "SELECT u FROM Usuario u WHERE u.email = :email"),
		@NamedQuery(name = "Usuario.findByAtivo", query = "SELECT u FROM Usuario u WHERE u.ativo = :ativo") })
public class Usuario implements Serializable {
	private static final long serialVersionUID = 1L;
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "usuarios_idusuario_seq")
	private Integer idUsuario;
	@Basic(optional = false)
	@Column(name = "nome_usuario", nullable = false, length = 50)
	private String nomeUsuario;
	@Basic(optional = false)
	@Column(name = "login", nullable = false, length = 16)
	private String login;
	@Basic(optional = false)
	@Column(name = "senha", nullable = false, length = 255)
	private String senha;
	@Column(name = "ddd")
	private Short ddd;
	@Column(name = "ramal")
	private String ramal;
	@Column(name = "telefone", length = 15)
	private String telefone;
	@Column(name = "email", length = 70)
	private String email;
	@Basic(optional = false)
	@Column(name = "ativo", nullable = false)
	private Boolean ativo;
	@OneToMany(cascade = CascadeType.ALL, mappedBy = "usuarioResolveu", fetch = FetchType.LAZY)
	private List<Evento> listaEventosResolvidos;
	@OneToMany(cascade = CascadeType.ALL, mappedBy = "usuarioCriador", fetch = FetchType.LAZY)
	private List<Evento> listaEventosCriados;
	@OneToMany(cascade = CascadeType.ALL, mappedBy = "usuarioVisualizou", fetch = FetchType.LAZY)
	private List<Evento> listaEventosVisualizou;
	@OneToMany(cascade = CascadeType.ALL, mappedBy = "idUsuario", fetch = FetchType.LAZY)
	private List<QuestResposta> listaQuestResposta;
	@OneToMany(cascade = CascadeType.ALL, mappedBy = "consultor", fetch = FetchType.LAZY)
	private List<Entidade> listaEventosConsultor;
	@JoinColumn(name = "idgrupo", referencedColumnName = "idgrupo", nullable = false)
	@ManyToOne(optional = false, fetch = FetchType.EAGER)
	private Grupo grupo;

	public Usuario() {
	}

	public Usuario(Integer idusuario) {
		this.idUsuario = idusuario;
	}

	public Usuario(Integer idusuario, String nomeUsuario, String login,
			String senha, Boolean ativo, String ramal) {
		this.idUsuario = idusuario;
		this.nomeUsuario = nomeUsuario;
		this.login = login;
		this.senha = senha;
		this.ativo = ativo;
		this.ramal = ramal;
	}

	public Integer getIdUsuario() {
		return idUsuario;
	}

	public void setIdUsuario(Integer idUsuario) {
		this.idUsuario = idUsuario;
	}

	public String getNomeUsuario() {
		return nomeUsuario;
	}

	public void setNomeUsuario(String nomeUsuario) {
		this.nomeUsuario = nomeUsuario;
	}

	public String getLogin() {
		return login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public Short getDdd() {
		return ddd;
	}

	public void setDdd(Short ddd) {
		this.ddd = ddd;
	}
	
	public String getRamal() {
		return ramal;
	}

	public void setRamal(String ramal) {
		this.ramal = ramal;
	}

	public String getTelefone() {
		return telefone;
	}

	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public Boolean getAtivo() {
		return ativo;
	}

	public void setAtivo(Boolean ativo) {
		this.ativo = ativo;
	}

	public List<Evento> getListaEventosResolvidos() {
		return listaEventosResolvidos;
	}

	public void setListaEventosResolvidos(List<Evento> listaEventosResolvidos) {
		this.listaEventosResolvidos = listaEventosResolvidos;
	}

	public List<Evento> getListaEventosCriados() {
		return listaEventosCriados;
	}

	public void setListaEventosCriados(List<Evento> listaEventosCriados) {
		this.listaEventosCriados = listaEventosCriados;
	}

	public List<Evento> getListaEventosVisualizou() {
		return listaEventosVisualizou;
	}

	public void setListaEventosVisualizou(List<Evento> listaEventosVisualizou) {
		this.listaEventosVisualizou = listaEventosVisualizou;
	}

	public List<QuestResposta> getListaQuestResposta() {
		return listaQuestResposta;
	}

	public void setListaQuestResposta(List<QuestResposta> listaQuestResposta) {
		this.listaQuestResposta = listaQuestResposta;
	}

	public List<Entidade> getListaEventosConsultor() {
		return listaEventosConsultor;
	}

	public void setListaEventosConsultor(List<Entidade> listaEventosConsultor) {
		this.listaEventosConsultor = listaEventosConsultor;
	}

	public Grupo getGrupo() {
		if (grupo == null){
			grupo = new Grupo();
		}
		return grupo;
	}

	public void setGrupo(Grupo grupo) {
		this.grupo = grupo;
	}

	@Override
	public int hashCode() {
		int hash = 0;
		hash += (idUsuario != null ? idUsuario.hashCode() : 0);
		return hash;
	}

	@Override
	public boolean equals(Object object) {
		// TODO: Warning - this method won't work in the case the id fields are
		// not set
		if (!(object instanceof Usuario)) {
			return false;
		}
		Usuario other = (Usuario) object;
		if ((this.idUsuario == null && other.idUsuario != null)
				|| (this.idUsuario != null && !this.idUsuario
						.equals(other.idUsuario))) {
			return false;
		}
		return true;
	}

	@Override
	public String toString() {
		return "br.com.attende.model.Usuario[idusuario=" + idUsuario + "]";
	}

}
